Получение доступа MCP-агентом
Эта страница описывает только создание agent account и получение первого Bearer-токена. После этого агент работает не через эти endpoints, а через обычные ERP-методы, перечисленные в разделе «MCP: как агент работает с Gigma ERP».
Agent account не может войти по одноразовому паролю:
POST /api/send_password
POST /api/login Для пользователя с is_agent = true оба метода возвращают 403.
Полный self-service flow
1. MCP-клиент создаёт access request
2. Gigma отправляет владельцу письмо
3. Владелец просматривает и подтверждает permissions
4. MCP-клиент опрашивает status
5. После approved один раз вызывает consume
6. Backend создаёт agent account и возвращает Agent Token
7. MCP-сервер сохраняет токен как секрет и переходит к обычным ERP endpoints Access request живёт 30 минут. Возможные состояния:
| Статус | Значение |
|---|---|
pending | ожидается решение владельца |
approved | можно выполнить consume |
declined | владелец отказал |
expired | TTL истёк |
consumed | agent account и первый токен уже созданы |
1. Создать запрос
Создание запроса доступа
- Метод
- POST
- URL
https://api.gigma.ru/api/agent-access-requests- Авторизация
- Не требуется
- Headers
Accept: application/json; Content-Type: application/json- Успешный ответ
201
Параметры запроса
owner_email(string, обязательно) — e-mail владельца или уполномоченного администратора проекта, до 255 символов;agent_name(string, обязательно) — понятное имя агента, от 1 до 255 символов;agent_login(string, необязательно) — уникальный технический login, от 3 до 255 символов;permissions(string[], необязательно) — до 100 существующих permissions сguard_name = user;purpose(string, необязательно) — назначение агента, до 5000 символов.
project_id и role_id клиент не передаёт.
Пример запроса
{
"owner_email": "owner@example.com",
"agent_name": "MCP Order Assistant",
"agent_login": "mcp-order-assistant",
"permissions": [
"view-orders",
"view-counterparties"
],
"purpose": "Читать заказы и готовить сводки"
} Ответ
{
"message": "Если такой администратор есть, мы отправили запрос.",
"request": {
"public_id": "3f48862d-516d-4c7b-b486-9b7bb205f920",
"request_token": "<request_token>",
"expires_at": "2026-08-16T16:30:00+00:00"
}
} Сохраните public_id и request_token сразу. request_token показывается клиенту в этом ответе и используется для status и consume.
Ответ намеренно нейтрален: он не раскрывает, существует ли owner_email и имеет ли пользователь право подтверждать запрос.
Backend ограничивает отправку approval-письма одному владельцу: не чаще одного письма за 10 минут. Новый access request при этом всё равно может получить 201, но письмо для него не будет отправлено. Не создавайте запросы повторно сразу после успешного ответа.
2. Открыть страницу подтверждения
Страница подтверждения для владельца
- Метод
- GET
- URL
https://api.gigma.ru/api/agent-access-requests/{publicId}/review- Авторизация
- Не требуется
- Headers
Accept: text/html- Успешный ответ
200
Параметры пути
publicId(string, обязательно) — публичный UUID запроса из ответа создания.
Пример запроса
GET /api/agent-access-requests/3f48862d-516d-4c7b-b486-9b7bb205f920/review
Accept: text/html Ответ
Backend возвращает HTML-страницу подтверждения. Ссылка из письма содержит секрет во fragment:
https://api.gigma.ru/api/agent-access-requests/{publicId}/review#approval_token=<secret> Fragment не отправляется серверу в URL. Страница читает approval_token, удаляет его из адресной строки и передаёт дальше только в JSON body.
3. Получить данные запроса
Получение данных для review
- Метод
- POST
- URL
https://api.gigma.ru/api/agent-access-requests/{publicId}/review- Авторизация
- Approval token из письма
- Headers
Accept: application/json; Content-Type: application/json- Успешный ответ
200
Параметры запроса
approval_token(string, обязательно) — секрет из fragment ссылки подтверждения.
approval_token запрещено передавать в query string. Backend вернёт 422.
Пример запроса
{
"approval_token": "<approval_token>"
} Ответ
{
"status": "pending",
"request": {
"public_id": "3f48862d-516d-4c7b-b486-9b7bb205f920",
"agent_name": "MCP Order Assistant",
"agent_login": "mcp-order-assistant",
"role": {
"id": 14,
"name": "employee"
},
"requested_permissions": [
"view-orders",
"view-counterparties"
],
"approved_permissions": null,
"purpose": "Читать заказы и готовить сводки",
"expires_at": "2026-08-16T16:30:00+00:00"
}
}4. Одобрить или отклонить
Подтверждать доступ может только незаблокированный человек текущего проекта:
- owner или admin;
- либо пользователь с
edit-admins; - либо пользователь с
edit-permissions.
Agent account подтверждать запрос не может.
Одобрение доступа
- Метод
- POST
- URL
https://api.gigma.ru/api/agent-access-requests/{publicId}/approve- Авторизация
- Approval token из письма
- Headers
Accept: application/json; Content-Type: application/json- Успешный ответ
200
Параметры запроса
approval_token(string, обязательно) — секрет подтверждения;permissions(string[], необязательно) — итоговое подмножество первоначально запрошенных permissions.
Если permissions не переданы, backend пытается одобрить весь requested-набор. Недоступные права не отбрасываются автоматически: запрос вернёт 422.
Во время approve backend выбирает роль проекта:
employee;- если её нет — legacy
employer.
Если подходящей роли нет или подтверждающий пользователь не может её назначить, backend возвращает 422.
Пример запроса
{
"approval_token": "<approval_token>",
"permissions": [
"view-orders"
]
} Ответ
{
"status": "approved",
"message": "Доступ одобрен. Агент может забрать токен."
}Отклонение доступа
- Метод
- POST
- URL
https://api.gigma.ru/api/agent-access-requests/{publicId}/decline- Авторизация
- Approval token из письма
- Headers
Accept: application/json; Content-Type: application/json- Успешный ответ
200
Параметры запроса
approval_token(string, обязательно) — секрет подтверждения.
Пример запроса
{
"approval_token": "<approval_token>"
} Ответ
{
"status": "declined",
"message": "Запрос доступа отклонён."
}5. Проверить статус
Статус запроса доступа
- Метод
- POST
- URL
https://api.gigma.ru/api/agent-access-requests/{publicId}/status- Авторизация
- Request token MCP-клиента
- Headers
Accept: application/json; Content-Type: application/json- Успешный ответ
200
Параметры запроса
request_token(string, обязательно) — секрет, полученный при создании access request.
request_token передаётся только в JSON body. Query string отклоняется с 422.
Пример запроса
{
"request_token": "<request_token>"
} Ответ
{
"status": "approved",
"expires_at": "2026-08-16T16:30:00+00:00",
"server_time": "2026-08-16T16:05:12+00:00"
} Polling:
- используйте интервал не меньше 3–5 секунд;
- применяйте backoff после
429; - после
approvedпереходите кconsume; - остановитесь после
declined,expiredилиconsumed.
6. Один раз получить Agent Token
Создание агента и получение первого токена
- Метод
- POST
- URL
https://api.gigma.ru/api/agent-access-requests/{publicId}/consume- Авторизация
- Request token MCP-клиента
- Headers
Accept: application/json; Content-Type: application/json- Успешный ответ
200
Параметры запроса
request_token(string, обязательно) — секрет, полученный при создании access request.
Вызывайте endpoint только после статуса approved.
Пример запроса
{
"request_token": "<request_token>"
} Ответ
Первый успешный ответ:
{
"status": "consumed",
"agent": {
"id": 214,
"name": "MCP Order Assistant",
"login": "mcp-order-assistant"
},
"agent_token": {
"id": 901,
"name": "mcp-self-service",
"value": "<agent_bearer>",
"expires_at": "2027-08-16T16:05:20+00:00"
}
} agent_token.value показывается только в этом ответе. Сохраните его в secret storage до завершения операции.
Повторный consume не возвращает секрет:
{
"status": "consumed",
"already_consumed": true
} Backend окончательно проверяет уникальность agent_login именно во время consume. Если login уже занят, ответ — 409; изменить login в одобренном request нельзя, нужен новый запрос.
Перед созданием агента backend повторно проверяет, что владелец всё ещё активен, имеет право подтверждать доступ и остаётся в том же проекте. После временного 403 или project conflict тот же одобренный request можно повторить после устранения причины, пока не истёк общий 30-минутный TTL.
Текущие route limits
| Endpoint | Текущий limit |
|---|---|
POST /api/agent-access-requests | 5/min |
GET /api/agent-access-requests/{publicId}/review | 30/min |
POST /api/agent-access-requests/{publicId}/review | 30/min |
POST /api/agent-access-requests/{publicId}/approve | 10/min |
POST /api/agent-access-requests/{publicId}/decline | 10/min |
POST /api/agent-access-requests/{publicId}/status | 30/min |
POST /api/agent-access-requests/{publicId}/consume | 10/min |
Это текущая runtime-конфигурация routes, а не бессрочное продуктовое обещание. Клиент обязан обрабатывать 429, учитывать Retry-After, если заголовок присутствует, и не дублировать write-запрос вслепую.
После consume
- Сохраните
agent_token.valueкак секрет. - Выполните
GET /api/user. - Сверьте фактическую роль, филиал и permissions.
- Включите только заранее определённый allowlist tools.
- Перейдите к обычным ERP endpoints из раздела «MCP: как агент работает с Gigma ERP».
Если первый Bearer потерян, восстановить его нельзя. Сотрудник с manage-agent-tokens должен выпустить новый токен через /api/agents/{agent}/tokens.